室友的朋友來(業餘塔羅大師!?),大家玩桌遊算塔羅(各種感情問題···)玩到了兩點多,星期日賴床到下午還有鐵人賽(想休息··),不過開賽到現在已經21天整整三星期了,也進入最後完賽倒數(!?)時間過得比想像中快啊···。
撰寫程式的原則是什麼?因為需求隨時都會改變(或是增加),程式碼並沒有完成的一天,所以程式需要容易被理解、閱讀和修改,並且要具備彈性,因此從容易閱讀的觀點來看,減少命名中不必要的贅字就是基本。
每一個類別、函數式甚至是變數都有意圖解決的問題,但是在變數、方法和類別的命名上,卻有很多累贅或是看不出意圖的命名方式(例如:temp
、info
、loop
),用更清楚的方式去命名在未來維護時會更容易。
橋接模式( Bridge ),將抽象部分與它的實現部分分離,使它們都可以獨立地變化。
-- 大話設計模式 p.335
想想A與B個有十種,太可怕了···這樣總共就要寫100種特例了!
因為繼承會限制靈活度,父類別的變化也會影響到子類別的變化,所以橋接模式(跟組合模式···等等其他模式)試著解決這個問題時有遵守一個原則「多用組合、少用繼承
」。也就是盡量使用組合(聚合)來代替類別繼承,這樣可以提高自由度,並且在各個類別的種類增加時,用少量的程式碼組合出系統所需要的所有種類的表示。
假想一個頁面需要呈現各種不同商品,但是頁面上又需要有不同的頁面,例如只呈現簡單資訊的頁面和詳細資訊的頁面,要把這些不同的資訊串接起來···
定義頁面的Super Class
public abstract class View {
Resources resources;
public void setResources(Resources resources){
this.resources = resources;
}
// 定義畫面如何擺放
public abstract void show();
}
定義來源的介面
public interface Resources {
public void photo();
public void snippet();
public void describe();
}
書本和包包來源
書本:
public class Book implements Resources {
@Override
public void photo() {
System.out.println("書本的照片");
}
@Override
public void snippet() {
System.out.println("書本的簡短說明");
}
@Override
public void describe() {
System.out.println("書本詳細說明");
}
}
包包:
public class Bag implements Resources {
@Override
public void photo() {
System.out.println("包包的照片");
}
@Override
public void snippet() {
System.out.println("包包的簡短說明");
}
@Override
public void describe() {
System.out.println("包包詳細說明");
}
}
小資訊的頁面根所有資訊的頁面
小資訊
public class FewView extends View{
@Override
public void show() {
resources.photo();
resources.snippet();
}
}
所有資訊
public class FullView extends View {
@Override
public void show() {
resources.photo();
resources.describe();
}
}
測試一下
public class Test {
@org.junit.jupiter.api.Test
public void test(){
FewView fewView = new FewView();
System.out.println("---- 簡單包包說明 ----");
fewView.setResources(new Bag());
fewView.show();
System.out.println("---- 簡單書本說明 ----");
fewView.setResources(new Book());
fewView.show();
FullView fullView = new FullView();
System.out.println("---- 詳細包包說明 ----");
fullView.setResources(new Bag());
fullView.show();
System.out.println("---- 詳細書本說明 ----");
fullView.setResources(new Book());
fullView.show();
}
}
測試結果
---- 簡單包包說明 ----
包包的照片
包包的簡短說明
---- 簡單書本說明 ----
書本的照片
書本的簡短說明
---- 詳細包包說明 ----
包包的照片
包包詳細說明
---- 詳細書本說明 ----
書本的照片
書本詳細說明
今天的討論就到這邊~如果有什麼錯誤或是意見歡迎留言私訊討論,感恩!